#ifndef __DEV_UART_H__
#define __DEV_UART_H__

#include "device_def.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

// UART事件
enum {
    UART_EVT_DATA_READY = 0U, 
};

// UART 设备控制字
enum {
    UART_CMD_MONITOR = 0U,      // UART监视
    UART_CMD_TRANSMIT,          // UART发送
    UART_CMD_RECEIVE,           // UART接收
};

// UART结构体
DEVICE_CONTEXT_DECLARE 
(
    Dev_Uart,
    
    struct {
        /**
        * @brief 串口发送
        * @param pu8Data 待发送数据指针
        * @param u32Len 待发送数据长度
        * @return 发送成功返回0，否则返回错误码
        */
        uint8_t 
        (*pfnTransmit)(uint8_t* pu8Data, uint32_t u32Len);

        /**
        * @brief 串口接收
        * @param pu8Data 接收数据指针
        * @param u32Len 接收数据长度
        * @return 接收成功返回实际接收长度，否则返回错误码
        */
        uint32_t 
        (*pfnReceive)(uint8_t* pu8Data, uint32_t u32Len);
    },

    struct {
        uint8_t* pu8Data;   // 缓存数据指针
        uint32_t u32Len;    // 缓存长度
        uint32_t u32Head;   // 头位置
        uint32_t u32Tail;   // 尾位置
        uint32_t u32Index;  // 当前长度
        uint32_t u32TimeOut; // 超时时间(MS)
    }
);

// UART 设备大小
#define DEV_UART_SIZE sizeof(Dev_Uart_t)

// UART设备数据结构体
typedef struct Dev_Uart_Data {
    uint8_t* pu8Data;   // 缓存数据指针
    uint32_t u32Len;    // 缓存长度
}Dev_Uart_Data_t;

#ifdef __cplusplus
}
#endif

#endif /* __DEV_UART_H__ */
